#ifndef __KEYRECOMMENDER_H__
#define __KEYRECOMMENDER_H__

#include "./../../../include/online/Tools/ProtocolParser.h"
#include "./../Reactor/TcpConnection.h"
#include "Dictionary.h"
#include "EditDistance.h"
#include <string.h>
#include <queue>
#include <set>

using namespace std;
using nlohmann::json;

struct CandidateResult
{
   string _word;    // 词
   int _freq;       // 词频
   int _dist;       // 编辑距离
};

class MyCompare
{
public:
    bool operator()(const CandidateResult & lhs,const CandidateResult & rhs)
    {
        if(lhs._dist==rhs._dist) //如果编辑距离相同
        {
            if(lhs._freq==rhs._freq)  //并且词频
            {
                if(lhs._word<rhs._word) //如果左操作数的单词小于有操作数的单词
                {                               //左优先级大于右优先级          
                    return false;
                }
                else{
                    return true;
                }
            }
            else
            {
                if(lhs._freq<rhs._freq)   //距离相等情况下 词频谁大谁为大 
                {
                    return true;
                }
                else{
                    return false;
                }
            }
        }
        else{
                if(lhs._dist<rhs._dist)  //谁编辑距离小 谁优先级高
                {
                    return false;    //左操作数优先级高
                }
                else{
                    return true;    //右操作数优先级高
                }
            }
        }
};

//关键字推荐模块
class KeyRecommender
{
public:
    KeyRecommender(const string &query);
    ~KeyRecommender() {}

    void execute();             //执行查询
    void queryIndexTable();    //查询索引
    void statistic(set<int> &iset,Dictionary * pdict,int flag);  //进行计算
    int distance(const string &rhs); //计算最小编辑距离
    json repstr();
    json response();                 //相应客户端的请求             
   
private:
    string _queryWord;          //等查询的单词
    priority_queue<CandidateResult,vector<CandidateResult>,MyCompare> _resultQue; //保存候选结果集 
};


#endif
